Skip to content

1. 变量的补充:scanf 函数与缓冲区

1.1 scanf 函数的工作原理

  • 输入缓冲区
    • 当用户通过键盘输入数据时,系统会先将数据存入输入缓冲区。
    • 缓冲区是内存空间的一部分,用于临时存储输入输出数据,以提高程序运行效率。
  • scanf 的行为
    • scanf 会从输入缓冲区中逐个取出内容,并将其赋值给变量。
    • 如果输入缓冲区不为空,scanf 会直接从缓冲区中获取数据,而不会要求用户再次输入。

1.2 scanf 清空缓冲区

  • 问题
    • 如果输入缓冲区中残留了无效数据(如回车、空格等),可能会导致 scanf 行为异常。
  • 解决方法
    • 使用 setbuf(stdin, NULL) 清空输入缓冲区。
    • 示例:
      c
      setbuf(stdin, NULL); // 清空输入缓冲区
      scanf("%d", &num);   // 重新读取用户输入

1.3 scanf 的注意事项

  • scanf 在读取数字时会跳过空格、制表符和回车。
  • 示例:
    c
    int num1 = 0, num2 = 0;
    printf("input num1: ");
    scanf("%d", &num1);  // 读取第一个数字
    printf("num1 = %d\n", num1);
    
    printf("input num2: ");
    scanf("%d", &num2);  // 读取第二个数字
    printf("num2 = %d\n", num2);

2. 整型数据类型的补充

C语言中,整型数据类型包括 shortintlonglong long,每种类型的有符号和无符号版本。

2.1 整型数据类型的特点

  • 占用空间和表示范围

    • 不同操作系统和位数(如 16 位、32 位、64 位)下,整型数据类型的占用空间和表示范围可能不同。
    • 以 64 位 Windows 环境为例:
      数据类型占用空间表示范围占位符
      char1 字节-128 ~ 127%c
      unsigned char1 字节0 ~ 255%c
      short2 字节-32768 ~ 32767%hd
      unsigned short2 字节0 ~ 65535%hu
      int4 字节-2147483648 ~ 2147483647%d
      unsigned int4 字节0 ~ 4294967295%u
      long4 字节-2147483648 ~ 2147483647%ld
      unsigned long4 字节0 ~ 4294967295%lu
      long long8 字节-2^63 ~ 2^63-1%lld
      unsigned long long8 字节0 ~ 2^64-1%llu
  • 示例

    c
    int a = 1;
    short b = 2;
    long c = 3;
    long long d = 5;
    unsigned long e = 6;

3. 进制转换:十进制与二进制

3.1 十进制转二进制

  • 整数部分(除 2 取余法)

    1. 将十进制数不断除以 2,记录余数。
    2. 将余数逆序排列,得到二进制结果。
    • 示例:将 13 转换为二进制
      13 / 2 = 6 余 1
       6 / 2 = 3 余 0
       3 / 2 = 1 余 1
       1 / 2 = 0 余 1
      • 余数逆序排列:1101(二进制)。
  • 小数部分(乘 2 取整法)

    1. 将小数部分不断乘以 2,记录整数部分。
    2. 将整数部分顺序排列,得到二进制结果。
    • 示例:将 0.6 转换为二进制
      0.6 * 2 = 1.2 → 1
      0.2 * 2 = 0.4 → 0
      0.4 * 2 = 0.8 → 0
      0.8 * 2 = 1.6 → 1
      • 整数部分顺序排列:1001(二进制)。

3.2 二进制转十进制

  • 方法
    1. 将二进制数的每一位乘以 2 的幂次方(从右到左,幂次从 0 开始)。
    2. 将所有结果相加,得到十进制数。
    • 示例:将 1101 转换为十进制
      1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0
      = 8 + 4 + 0 + 1
      = 13(十进制)

总结

  1. scanf 函数与缓冲区
    • scanf 从输入缓冲区中读取数据,缓冲区残留数据可能导致问题,可通过 setbuf(stdin, NULL) 清空缓冲区。
  2. 整型数据类型
    • 包括 shortintlonglong long,每种类型的有符号和无符号版本占用空间和表示范围不同。
  3. 进制转换
    • 十进制转二进制:整数部分用除 2 取余法,小数部分用乘 2 取整法。
    • 二进制转十进制:按位乘以 2 的幂次方并相加。

知识如风,常伴吾身